7.1 Array.from()
功能:可以将两类对象转为真正的数组,从而使用数组丰富的方法
类似数组的对象(array-like object)
:即存在 length 属性的对象可遍历(iterable)的对象
,包括 ES6 新增的数据结构 Set 和 Map
注意: 类数组对象也可以通过 call
或apply
的方式强行调用Array
数组的方法
参数 | 说明 | |
---|---|---|
参数1 | 可以被转为数组的对象 | |
参数2 | 类似数组的 map 方法 | |
参数3 | 要绑定的上下文 |
7.1.1 转换类数组对象中为数组
- DOM 操作返回的 NodeList 集合
- 函数内部的 arguments 对象
- 自定义的类数组对象
1 | /* 1. 自定义的类数组对象 */ |
7.1.2 es5环境下的 polyfill
1 | const toArray = (() => |
7.1.3 第二个参数
说明:租用类似于数组的 map
方法,用来对每个元素进行处理,将处理后的值放在返回的数组中
7.1.3.1 基础
1 | Array.from(arrayLike, x => x * x); |
7.1.3.2 几个例子
1 | /* 1. 取出一组DOM节点的文本内容 */ |
7.1.3.3 扩展运算符
说明:扩展运算符也可以将可遍历对象(即部署了便利器接口Symbol.iterator
)转换为数组,但不支持类数组对象。
1 | // arguments对象 |
7.1.3.4 奇技淫巧
- 利用第一个参数的 length 属性和第二个参数
1 | Array.from({ length: 2 }, () => 'jack') |
- 返回字符串的长度(能正确处理各种
Unicode
字符, 避免 JS 将大于\uFFFF
的Unicode的字符算作两个字符的 bug)
1 | function countSymbols(string) { |
7.2 Array.of()
功能:将一组值转换为数组
说明:Array.of
基本可以用来替代Array()
或new Array()
,并且不存在由于参数不同而导致的重载
7.2.1 Array.of() vs. Array()
1 | Array() // [] |
7.2.2 polyfill
1 | function ArrayOf(){ |
7.3 数组实例的 copyWithin()
Array 实例方法 copyWithin()
功能:将指定位置的成员复制到其他位置(会覆盖原有成员),然后返回当前数组
注意:参数都为数值,如果不是,会自动转为数值
参数 | 说明 | 是否必需 | 备注 |
---|---|---|---|
target | 目的地 起点下标 | 是 | |
start | 源 起点下标 | 否 | 默认为0,如果为负值,表示倒数 |
end | 源 终点下标 + 1 | 否 | 默认为0,如果为负数,表示倒数 |
1 | // 将3号位复制到0号位 |
7.4 数组实例的 find() 和 findIndex()
注意:这两个方法都能够发现NaN
,ni
7.4.1 find()
功能:找到第一个符合条件的数组成员
返回值:第一个返回值为true
的成员 ,没有则返回 undefined
参数 | 说明 |
---|---|
参数1(必需) | 一个回调函数,所有数组成员会依次执行该回调 |
参数2(可选) | 回调函数执行的上下文 |
回调函数(第一个参数)
参数 | 说明 |
---|---|
value | 当前成员值 |
index | 当前成员下标 |
arr | 原数组 |
1 | [1, 3, 8, 7, -5].find((n) => n < 0)//-5 |
7.4.1 findIndex()
功能:找到第一个符合条件的数组成员的位置
返回值:找到则返回成员位置,否则返回 -1
注意:除了返回值是成员的位置而不是成员本身外,其它方面和 find()
完全一致
1 | [NaN].indexOf(NaN) |
7.5 数组实例的 fill()
功能:使用给定值填充数组,数组中已有的元素会被全部抹去
是否有副作用:是
返回值:新数组
参数 | 说明 |
---|---|
参数1(必需) | 填充数组的元素 |
参数2(可选) | 填充的开始位置 |
参数3(可选) | 填充的结束位置 |
1 | ['a', 'b', 'c'].fill(7)// [7, 7, 7] |
7.6 数组实例的 entries(), keys()和values()
用途:都针对特定方面遍历数组
返回值:便利器对象,可以通过for-of
循环便利器对象的 next
方法进行遍历
方法 | 说明 |
---|---|
keys() | 返回数组中key 的遍历器对象 |
values() | 返回数组中value 的遍历器对象 |
entries() | 返回数组中key-value 的遍历器对象 |
1 | for (let index of ['a', 'b'].keys()) { |
1 | let letter = ['a', 'b', 'c']; |
7.7 数组实例的 includes()
功能:判断数组中是否包含给定的值
返回值:true
存在, false
不存在
支持:该方法属于ES7
,但 Babel
转码器已经支持
参数 | 说明 |
---|---|
参数1(必需) | 要搜索的 value |
参数2(可选) | 搜索的开始位置 |
1 | [1, 2, 3].includes(2); // true |
7.7.1 includes() vs. indexOf()
如果用indexOf()
替代includes()
来确定数组中是否包含给定的值,存在两个问题
- 不够语意化,而且还要比较下标是否不等于-1
indexOf()
内部使用===
进行判断,会导致对NaN
的误判
1 | [NaN].indexOf(NaN) |
7.7.2 polyfill
使用Array.prototype.some
实现includes
功能
1 | const contains = (() => |
7.7.3 Map 和 Set
说明:Map
和 Set
数据结构有一个has
方法,需要注意和includes
区分
Map 结构的has
方法:用来查找key
- Map.prototype.has(key)
- WeakMap.prototype.has(key)
- Reflect.has(target, propertyKey)
Set 结构的has
方法:用来查找值
- Set.prototype.has(value)
- WeakSet.prototype.has(value)
7.8 数组的空位
说明:数组中没有任何值的元素就是一个数组的空位
注意:空位不是undefined
1 | Array(3) // [, , ,] |
7.8.1 ES5对空位的处理
数组方法 | 空位的处理 |
---|---|
forEach() | 跳过空位 |
filter() | 跳过空位 |
every() | 跳过空位 |
some() | 跳过空位 |
map() | 跳过空位,但返回的数组中仍保留着这个空位 |
join() | 将空位视为undefined (undefined、null 会被处理成空字符串) |
toString() | 将空位视为undefined (undefined、null 会被处理成空字符串) |
1 | // forEach方法 |
7.8.2 ES6对空位的处理
注意:由于空位处理规则非常不统一,所以建议避免出现空位
运算 | 说明 |
---|---|
Array.from() | 不会忽略空位,而是将空位转为undefined |
扩展运算符 | 不会忽略空位,而是将空位转为undefined |
copyWithin() | 连空位一起拷贝 |
fill() | 将空位视为正常的数组位置 |
for-of | 会遍历空位 |
entries()、keys()、values()、find()、findIndex() | 会将空位处理成undefined |
1 | Array.from(['a',,'b']) |